#pragma once

#include <cstdio>
#include <cstdarg>
#include <cassert>
#include <time.h>
#include <cstdlib>

#define DEBUG 0 
#define NOTICE 1
#define WARNING 2
#define FATAL 3

const char* log_level[] = {"DEBUG", "NOTICE", "WARNING", "FATAL"};

void logMsg(int level, const char* format, ...)
{
    assert(level >= DEBUG);
    assert(level <= FATAL);

    char *name = getenv("USER");

    char logInfo[1024];
    va_list ap; // ap -> char*
    // 根据这个参数定位到可变部分的参数
    va_start(ap, format);

    vsnprintf(logInfo, sizeof(logInfo)-1, format, ap);

    va_end(ap); // ap = NULL


    FILE *out = (level == FATAL) ? stderr:stdout;

    // 将格式化的内容写到哪个文件/流里面
    fprintf(out, "%s | %u | %s | %s\n", \
        log_level[level], \
        (unsigned int)time(nullptr),\
        name == nullptr ? "unknow":name,\
        logInfo);

}
